/*
直接更新修改state的多个方法的对象
*/
//导入方法名
import Vue from 'vue'
import {
  RECEIVE_ADDRESS,
  RECEIVE_CATEGORYS,
  RECEIVE_SHOPS,
  RECEIVE_USER_INFO,
  RESET_USER_INFO,
  RECEIVE_GOODS,
  RECEIVE_RATINGS,
  RECEIVE_INFO,
  INCREMENT_FOOD_COUNT,
  DECREMENT_FOOD_COUNT,
  CLEAR_CART,
  RECEIVE_SEARCH_SHOPS
} from "./mutations-types";
// 导出
export default {
  //使用常量做方法名是 相当于 xx() {} 接收的参数是一个对象数据这里 解构赋值 接收数据赋值操作state
  [RECEIVE_ADDRESS](state, { address }) {
    state.address = address;
  },
  [RECEIVE_CATEGORYS](state, { categorys }) {
    state.categorys = categorys;
  },
  [RECEIVE_SHOPS](state, { shops }) {
    state.shops = shops;
  },
  [RECEIVE_USER_INFO](state, { userInfo }) {
    state.userInfo = userInfo;
  },
  [RESET_USER_INFO](state) {
    //重置user用户信息即可
    state.userInfo = {};
  },

  [RECEIVE_GOODS](state, { goods }) {
    state.goods = goods;
  },
  [RECEIVE_RATINGS](state, { ratings }) {
    state.ratings = ratings;
  },
  [RECEIVE_INFO](state, { info }) {
    state.info = info;
  },
  [INCREMENT_FOOD_COUNT](state, { food }) {
    //先确定有值没值在做操作 不然会报错 没值++ 什么
    if (!food.count) { //某一项food
      // food.count = 1; //没值或者undefined的情况下fasle在取反就是true 就赋初值 
      //这样写会发生一个 数据更新了但是数据没有绑定上去 就是没有双向绑定 解决方法通过vue语法的set方法实现
      /**params
       * 对象
       * 属性名 要加字符串 不加的话看成一个变量了
       * 属性值
       */
      Vue.set(food,'count',1)
      //当第一次添加的时候 就往cartfood添加food数据
      state.cartFoods.push(food) //这时候cartfoods就有值了
    } else {
      food.count++;
    }
  },
  [DECREMENT_FOOD_COUNT](state, { food }) {
    if (food.count) {
      food.count--;  //  food.count有值得时候才取操作 不然 会有负数 加一个限定
      if(food.count === 0) {
        //等于0的时候就要移除food 在cartfoods移除 
        // 返回指定字符在字符串中第一次出现处的索引，如果此字符串中没有这样的字符，则返回 -1。
        state.cartFoods.splice(state.cartFoods.indexOf(food),1) //找到food 返回索引删除
      }
    }
  },
  [CLEAR_CART](state) {
    //移除cartfoods下的food对象下的 count 属性 因为food多个对象引用的不清空不好操作
    state.cartFoods.forEach((food)=>food.count = 0)
    //清空cartfoods数组
    state.cartFoods=[]
  },
  [RECEIVE_SEARCH_SHOPS](state, {searchShops}) {
    state.searchShops = searchShops
  }
};
